# -*- coding:utf-8 -*-

# 给你两个单词 word1 和 word2，请你计算出将 word1 转换成 word2 所使用的最少操作数
# 你可以对一个单词进行如下三种操作：
# 插入一个字符
# 删除一个字符
# 替换一个字符

# 示例 1：
# 输入：word1 = "horse", word2 = "ros"
# 输出：3
# 解释：
# horse -> rorse (将 'h' 替换为 'r')
# rorse -> rose (删除 'r')
# rose -> ros (删除 'e')

# 示例 2：
# 输入：word1 = "intention", word2 = "execution"
# 输出：5
# 解释：
# intention -> inention (删除 't')
# inention -> enention (将 'i' 替换为 'e')
# enention -> exention (将 'n' 替换为 'x')
# exention -> exection (将 'n' 替换为 'c')
# exection -> execution (插入 'u')

# 提示：
# 0 <= word1.length, word2.length <= 500
# word1 和 word2 由小写英文字母组成

# 问题1：如果 word1[0..i-1] 到 word2[0..j-1] 的变换需要消耗 k 步，那 word1[0..i] 到 word2[0..j] 的变换需要几步呢？
# 答：先使用 k 步，把 word1[0..i-1] 变换到 word2[0..j-1]，消耗 k 步。再把 word1[i] 改成 word2[j]，就行了。如果 word1[i] == word2[j]，什么也不用做，一共消耗 k 步，否则需要修改，一共消耗 k + 1 步
# 问题2：如果 word1[0..i-1] 到 word2[0..j] 的变换需要消耗 k 步，那 word1[0..i] 到 word2[0..j] 的变换需要消耗几步呢？
# 答：先经过 k 步，把 word1[0..i-1] 变换到 word2[0..j]，消耗掉 k 步，再把 word1[i] 删除，这样，word1[0..i] 就完全变成了 word2[0..j] 了。一共 k + 1 步
# 问题3：如果 word1[0..i] 到 word2[0..j-1] 的变换需要消耗 k 步，那 word1[0..i] 到 word2[0..j] 的变换需要消耗几步呢？
# 答：先经过 k 步，把 word1[0..i] 变换成 word2[0..j-1]，消耗掉 k 步，接下来，再插入一个字符 word2[j], word1[0..i] 就完全变成了 word2[0..j] 了

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        if len(word1) == 0:
            return len(word2)
        if len(word2) == 0:
            return len(word1)

        x = len(word1)
        y = len(word2)
        
        dp = [[0 for i in xrange(x + 1)] for i in xrange(y + 1)]
        for i in xrange(x + 1):
            dp[0][i] = i
        for j in xrange(y + 1):
            dp[j][0] = j

        for i in xrange(x):
            for j in xrange(y):
                if word1[i] == word2[j]:
                    dp[j + 1][i + 1] = min(dp[j][i + 1], dp[j + 1][i], dp[j][i] - 1) + 1
                else:
                    dp[j + 1][i + 1] = min(dp[j][i + 1], dp[j + 1][i], dp[j][i]) + 1
        # print(dp)
        return dp[y][x]

t_list = []
t_list.append(["horse", "ros", 3])
t_list.append(["intention", "execution", 5])
t_list.append(["a", "a", 0])


t = Solution()
# print t.minDistance("horse", "ros")
# print t.minDistance("intention", "execution")

for i in xrange(len(t_list)):
    v = t_list[i]
    if t.minDistance(v[0], v[1]) != v[2]:
        print(v)